package 力扣.双指针.最长区间;


import java.util.Arrays;

public class 无重复字符的最长子串3 {
    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0){
            return 0;
        }
       int N = s.length();
       int left = -1;//左指针
       int ans = 0;
       //记录当前元素 i 出现的位置
       int[] pos = new int[256];//s 由英文字母、数字、符号和空格组成
        Arrays.fill(pos, -1);
        for (int i = 0; i < N; i++) {
            //加入第i个元素之前先判断区间是否合法
            int t =Integer.valueOf(s.charAt(i));
            while (pos[t] > left){//可以看成 pos[t] 在区间 (left , i]中是否出现过,这里巧用下标来判断
                left = pos[t];//若出现了，将left移动到pos[i]位置上面
            }
            //加入第i个元素（即更新位置）
            pos[t] = i;
            ans = Math.max(ans, i - left);//更新最大长度
        }
        return ans;
    }

    public int lengthOfLongestSubstring2(String s) {
        if (s == null || s.length() == 0){
            return 0;
        }
        int N = s.length();
        int[] pos = new int[256];//由英文字母、数字、符号和空格组成
        int left = -1;
        Arrays.fill(pos,-1);
        int ans = 0;
        for (int i = 0; i < N; i++) {
            int p = s.charAt(i);
            if (pos[p] > left){//存在重复字符
                left = pos[p];
            }
            pos[p] = i;
            ans = Math.max(ans, i - left);//写在if语句外面，因为每次即使不存在重复字符也要重新计算最大值
        }
        return ans;
    }
}
